//
//  TTNetworkProtocol.swift
//  TTProduct
//
//  Created by Toj on 1/12/21.
//

import Foundation

public enum TTHTTPRequestType {
    // 发送一个请求来取得服务器上的某一资源, 并返回实体内容
    case get
    // 表示向指定资源提交数据, 数据包含在请求头中.
    // 有可能导致新的资源建立或原有资源修改
    case post
    // 从客户端向服务器传送的数据取代指定的内容, 即向指定的位置上传最新的内容
    case put
    // 对 PUT 方法的补充, 用来对已知资源进行局部更新
    case patch
    // 只请求页面的首部
    case head
    // 删除服务器上的某资源
    case delete
    // 用于获取当前 url 所支持的方法.
    // 如果请求成功, 会有一个 allow 的头包含类似 get、post 这样的信息
    // 返回服务器针对特殊资源所支持的 HTML 请求方式 或 允许客户端查看服务器的性能
    case options
    // 用于激发一个远程的, 应用层的请求消息回路.
    case trace
    // 把请求连接转换到透明的 tcp/ip 通道
    case connect
}

public protocol TTNetworkProtocol: NSObjectProtocol {
    
    var timeoutInterval: TimeInterval { get }
    
    func get<Key,Value>(url urlString:String, headers:[String: String]?, parameters:Dictionary<Key,Value>?, success: ((Any?)->())?, failure: ((Error)->())?) where Key: Hashable
    
    func post<Key,Value>(url urlString:String, headers:[String: String]?, parameters:Dictionary<Key,Value>?, success: ((Any?)->())?, failure: ((Error)->())?) where Key: Hashable
}

extension TTNetworkProtocol {
    public var timeoutInterval: TimeInterval { return 15 }
    
    public func request(url urlString:String, request type: TTHTTPRequestType, headers:[String: String]?, parameters:[String: Any]?, success: ((Any?)->())?, failure: ((Error)->())?)  {
        
        if type == .post {
            post(url: urlString, headers: headers, parameters:parameters , success: success, failure: failure)
            return
        }
        
        if type == .get {
            get(url: urlString, headers: headers, parameters:parameters , success: success, failure: failure)
            return
        }
    }
}
